/***********************************************************************************************************************************
IO Read
***********************************************************************************************************************************/
#ifndef COMMON_IO_READ_H
#define COMMON_IO_READ_H

/***********************************************************************************************************************************
IO read object
***********************************************************************************************************************************/
typedef struct IoRead IoRead;

#include "common/io/filter/group.h"
#include "common/type/buffer.h"

/***********************************************************************************************************************************
Function pointer types
***********************************************************************************************************************************/
typedef bool (*IoReadOpen)(void *driver);
typedef size_t (*IoReadProcess)(void *driver, Buffer *buffer);
typedef void (*IoReadClose)(void *driver);
typedef bool (*IoReadEof)(void *driver);

/***********************************************************************************************************************************
Constructor
***********************************************************************************************************************************/
IoRead *ioReadNew(void *driver, IoReadOpen open, IoReadProcess read, IoReadClose close, IoReadEof eof);

/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
bool ioReadOpen(IoRead *this);
size_t ioRead(IoRead *this, Buffer *buffer);
void ioReadClose(IoRead *this);

/***********************************************************************************************************************************
Getters/Setters
***********************************************************************************************************************************/
bool ioReadEof(const IoRead *this);
const IoFilterGroup *ioReadFilterGroup(const IoRead *this);
void ioReadFilterGroupSet(IoRead *this, IoFilterGroup *FilterGroup);
size_t ioReadSize(const IoRead *this);

/***********************************************************************************************************************************
Macros for function logging
***********************************************************************************************************************************/
#define FUNCTION_DEBUG_IO_READ_TYPE                                                                                                \
    IoRead *
#define FUNCTION_DEBUG_IO_READ_FORMAT(value, buffer, bufferSize)                                                                   \
    objToLog(value, "IoRead", buffer, bufferSize)

#endif
